package repository

import (
	"context"
	"errors"

	"github.com/example/video_backend/internal/model"
	"gorm.io/gorm"
)

// CategoryRepository 分类仓库接口
type CategoryRepository interface {
	// 创建分类
	Create(ctx context.Context, category *model.Category) error
	// 根据ID获取分类
	GetByID(ctx context.Context, id uint) (*model.Category, error)
	// 获取所有分类
	GetAll(ctx context.Context) ([]*model.Category, error)
	// 更新分类
	Update(ctx context.Context, category *model.Category) error
	// 删除分类
	Delete(ctx context.Context, id uint) error
}

// categoryRepository 实现CategoryRepository接口
type categoryRepository struct {
	db *gorm.DB
}

// NewCategoryRepository 创建分类仓库实例
func NewCategoryRepository(db *gorm.DB) CategoryRepository {
	return &categoryRepository{db: db}
}

// Create 创建分类
func (r *categoryRepository) Create(ctx context.Context, category *model.Category) error {
	return r.db.WithContext(ctx).Create(category).Error
}

// GetByID 根据ID获取分类
func (r *categoryRepository) GetByID(ctx context.Context, id uint) (*model.Category, error) {
	var category model.Category
	err := r.db.WithContext(ctx).First(&category, id).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}
		return nil, err
	}
	return &category, nil
}

// GetAll 获取所有分类
func (r *categoryRepository) GetAll(ctx context.Context) ([]*model.Category, error) {
	var categories []*model.Category
	err := r.db.WithContext(ctx).Find(&categories).Error
	if err != nil {
		return nil, err
	}
	return categories, nil
}

// Update 更新分类
func (r *categoryRepository) Update(ctx context.Context, category *model.Category) error {
	return r.db.WithContext(ctx).Save(category).Error
}

// Delete 删除分类
func (r *categoryRepository) Delete(ctx context.Context, id uint) error {
	return r.db.WithContext(ctx).Delete(&model.Category{}, id).Error
}